package br.trainee.web.dao.impl.componentes;

import java.util.List;

import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.transaction.UserTransaction;

import br.trainee.web.dao.impl.EntityDAOImpl;
import br.trainee.web.dao.service.componentes.IAutoCompleteDAO;

public class AutoCompleteDAOImpl extends EntityDAOImpl implements IAutoCompleteDAO{
	
	private Class classeObjeto;

	public AutoCompleteDAOImpl() {
		super(null);
	}
	
	@PersistenceContext(unitName="WebJsf")
	private EntityManager em;
	
	@Resource
	private UserTransaction userTransaction;

	@Override
	public EntityManager getEntityManager() {
		return em;
	}

	@Override
	public UserTransaction getUserTransaction() {
		return userTransaction;
	}
	
	// Metodo que faz uma consulta dinamica e generica retornado uma List sem tipo.
	@Override
	public List consultarDinamico(String className, String columnName, String parameterReturn, String columnStatusName, Integer columnStatusValue, String atributeStatusName) throws Exception {
		
		userTransaction.begin();	
		
		// Criando a List com valor null.
		List listaRetorno = null;
		
		// Caso usuario tenha passado os 3 valores para busca por status entrara no if.
		if(atributeStatusName != "vazio" && columnStatusName != "vazio" && columnStatusValue != 0){
			
			// Montando a Query usando StringBuilder.
			StringBuilder sb = new StringBuilder();
			sb.append("select o from ");
			sb.append(className);
			sb.append(" o inner join o.");
			sb.append(atributeStatusName);
			sb.append(" s where lower(o.");
			sb.append(columnName);
			sb.append(") like :field and s.");
			sb.append(columnStatusName);
			sb.append(" like :fieldStatus");

			// Executando a Query, field é o valor digitado + "%", buscando tudo que começar com o valor informado e o fieldStatus é o valor status que sera usado na condição de busca.
			Query query = em.createQuery(sb.toString());
			query.setParameter("field", parameterReturn.toLowerCase() + "%");
			query.setParameter("fieldStatus", columnStatusValue);
					 
			// Lista de valores retornado atribuido a lista de retorno.
			listaRetorno = query.getResultList();
			
		}
		// Caso não for passado os 3 valores do status, a busca sera sem o status.
		else{
			
			// Montando a Query usando StringBuilder.
			StringBuilder sb = new StringBuilder();
			sb.append("select o from ");
			sb.append(className);
			sb.append(" o where lower(o.");
			sb.append(columnName);
			sb.append(") like :field ");

			// Executando a Query, field é o valor digitado + "%", buscando tudo que começar com o valor informado.
			Query query = em.createQuery(sb.toString());
			query.setParameter("field", parameterReturn.toLowerCase() + "%");

			// Lista de valores retornado atribuido a lista de retorno.
			listaRetorno = query.getResultList();
			
		}
		
		userTransaction.commit();
		
		// Retornado a lista carregada com o que recebeu da busca no banco.
		return listaRetorno;
	}
	
	public void setClasseObjeto(Class classeObjeto){
		this.classeObjeto = classeObjeto;
	}
	
	@Override
	public Class getClasseObjeto() {
	
		return super.getClasseObjeto();
	}

}
